package com.AdvancedDemos.LearnVariousAPI.数学计算类;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class LearnBigDecimal {
    public static void main(String[] args) {

        System.out.println(0.1 + 0.2);//0.30000000000000004
        System.out.println(1.0 - 0.32);//0.6799999999999999
        System.out.println(1.015 * 100);//101.49999999999999
        System.out.println(1.301 / 100);//0.013009999999999999

        /*
         * BigDeciaml 负责大数值的精确运算,带有舍入模式,用于浮点数精确运算,解决浮点型运算时,出现结果失真的问题
         * */

        //1.把浮点型数据封装成BigDecimal对象,再来参与运算
        //a. public BigDecimal(double val) 得到的BigDecimal对象是无法精确计算浮点型数据的,注意:不推荐使用此构造函数
        //b. public BigDecimal(String val) 得到的BigDecimal对象是可以精确计算浮点型数据的,可以使用
        //c. public static BigDecimal valueOf(double val); 通过这个静态方法得到的BigDecimal对象是可以精确运算的,是最好的方案

        double a = 0.1;
        double b = 0.2;

        BigDecimal a1 = new BigDecimal(a);
        BigDecimal b1 = new BigDecimal(b);
        BigDecimal c1 = a1.add(b1);//返回BigDecimal对象
        System.out.println(c1);//0.3000000000000000166533453693773481063544750213623046875 浮点数运算不精确不应该使用public BigDecimal(double val)构造函数

        a1 = new BigDecimal(Double.toString(a));
        b1 = new BigDecimal("0.2");
        c1 = a1.add(b1);
        System.out.println(c1);//0.3  精确运算

        a1 = BigDecimal.valueOf(a);
        b1 = BigDecimal.valueOf(b);
        /**
         * public static BigDecimal valueOf(double val) {
         *         return new BigDecimal(Double.toString(val));
         *     }
         */
        c1 = a1.add(b1);
        System.out.println(c1);//0.3 精确运算 推荐

        /*
         * public BigDecimal add(BigDecimal augend) --- 加法
         * public BigDecimal substract(BigDecimal augend) --- 减法
         * public BigDecimal multiply(BigDecimal augend) --- 乘法
         * public BigDecimal divide(BigDecimal augend) --- 除法
         * public BigDecimal divide(BigDecimal augend,精确几位,舍入模式) --- 除法,可以设置精确位数
         * public double doubleValue() --- 把BigDecimal对象转换成double类型数据
         * */

        System.out.println("----------------");
        BigDecimal subtract = a1.subtract(b1);
        System.out.println(subtract);
        System.out.println("----------------");
        System.out.println(a1.multiply(b1));
        System.out.println("----------------");
        System.out.println(a1.divide(b1));
        System.out.println("----------------");
//        System.out.println(new BigDecimal("0.1").divide(new BigDecimal("0.3")));//ArithmeticException:Non-terminating decimal expansion; no exact representable decimal result.
        System.out.println(new BigDecimal("0.1").divide(new BigDecimal("0.3"), 2/*表示保留两位小数*/, RoundingMode.HALF_UP/*表示四舍五入模式,RoundingMode是个枚举类,HALF_UP是当中的常量*/));

        /*
         * 舍入模式:
         * 1.进一法 RoundingMode.UP (就是即便不满5也入)
         * 2.去尾法 RoundingMode.FLOOR (就是即便超过5也舍)
         * 3.四舍五入 RoundingMode.HALF_UP
         * */

        System.out.println("----------------");
        double v = a1.doubleValue();//BigDecimal类转成double
        System.out.println(v);
    }
}
